#include "qmymenu.h"

#include <QEvent>
#include <QHelpEvent>
#include <QToolTip>
#include <QtDebug>

QMyMenu::QMyMenu(QWidget *parent)    // 更改构造函数，适配 QMenu::QMenu(QWidget *parent = nullptr)
    : QMenu(parent)
{

}

/*
使用代码的方式来显示 QAction 的 toolTip 。
三点注意事项：
- 获取鼠标位置的QAction用的是相对于Menu的坐标， 而显示ToolTip用的是全局坐标
- 显示tooltip之后要返回ture，表示当前ToolTip事件已经被处理。 不然底层继续处理该事件就会显示出QWidget设置的工具提示
- 函数最后要调用基类的event函数， 继续其他事件的处理。

问题：
- 设计器中将 QAction 的 toolTip 输入空格，调试提示框还是显示，内容为菜单项的文本。
- 使用代码设置也是这样显示菜单项的文本。 ui->actionItem3->setToolTip("");
- 问：如何让部分 QAction 的 toolTip 无内容，且不显示？
  - 目前想到，可约定一种特殊符号表示不用显示。
*/
bool QMyMenu::event(QEvent* e)
{
    switch(e->type())
    {
        case QEvent::ToolTip: //show action tooltip instead of widget tooltip
            {    // case 下也保持缩进。 c++ primer 上是这样写。
                QHelpEvent * he = dynamic_cast<QHelpEvent *>(e);
                QAction * act = actionAt(he->pos());
                if( act )
                {
                    qDebug() << act->toolTip();
                    QToolTip::showText(he->globalPos(), act->toolTip(), this);
                    return true;
                }
            }
            break;    // break 保持在大括号外。 c++ primer 上是这样写。
        default:    // 处理警告： enumeration values not handled in switch
            break;
    }
    return QMenu::event(e);
}
